#include <iostream>
#include <vector>

using namespace std;

const int N = 15;

int n;
bool col[N]; // 列
bool st1[N*N]; // 主对角线
bool st2[N*N]; // 副对角线

int ret;
vector<int> path;

// 摆第x行
void dfs(int x) 
{
	if(x > n) 
	{
		ret++;
		if(ret <= 3)
		{
			for(auto e : path) cout << e << " ";
			cout << endl;
		}

		return;
	}

	for(int y = 1; y <= n; y++)
	{
		//判断能不能摆在这一列
		if(col[y] || st1[y - x + n] || st2[y + x]) continue; // 剪枝

		col[y] = st1[y - x + n] = st2[y + x] = true;
		path.push_back(y);

		dfs(x + 1);

		//恢复现场
		col[y] = st1[y - x + n] = st2[y + x] = false;
		path.pop_back();
	}
}

int main()
{
	cin >> n;

	dfs(1);

	cout << ret << endl;

	return 0;
}

